import { Node, v3, Vec3 } from 'cc';

/**
 * 工具函数：获取 newParent 相对于 child 的本地坐标
 * @param child 子节点
 * @param newParent 新的父节点
 * @returns 相对于 child 的本地坐标
 */
export function getNewParentLocalPosInChild(child: Node, newParent: Node): Vec3 {
    // 获取 newParent 的世界坐标
    const newParentWorldPos: Vec3 = v3();
    newParent.getWorldPosition(newParentWorldPos);

    // 创建一个 Vec3 对象用于存储转换后的本地坐标
    const localPos = new Vec3();
    // 转换世界坐标到 child 节点的本地坐标
    child.inverseTransformPoint(localPos, newParentWorldPos);

    return localPos;
}

/**
 * 将物体 A 的父节点设置成物体 B，同时保持物体 A 在世界坐标系中的位置不变
 * @param objectA 要改变父节点的物体
 * @param objectB 新的父物体
 */
export function setParentWithoutChangingWorldPos(objectA: Node, objectB: Node) {
    // 记录物体 A 的世界坐标
    const worldPos = v3();
    objectA.getWorldPosition(worldPos);

    // 设置物体 A 的父节点为物体 B
    objectA.setParent(objectB);

    // 将物体 A 的本地坐标设置为相对于新父节点的坐标，以保持世界坐标不变
    objectB.inverseTransformPoint(objectA.position, worldPos);
}

/**
 * 获取目标节点相对于参考节点的相对坐标
 * @param targetNode 目标节点
 * @param referenceNode 参考节点
 * @returns 相对坐标
 */
export function getRelativePosition(targetNode: Node, referenceNode: Node): Vec3 {
    const targetWorldPos = v3();
    targetNode.getWorldPosition(targetWorldPos);
    const relativePos = v3();
    referenceNode.inverseTransformPoint(relativePos, targetWorldPos);
    return relativePos;
}